#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int maxn = 1e5 + 5;
int n, m;
bool fl;
char ss[maxn];
int tt[305][305];
void upd(int &x, int y){
    return x = x + y >= mod ? x + y - mod : x + y, void();
}
int f[1 << 17 | 5][2];
int tmp[1 << 17 | 5][2];
int pf[305][1 << 17 | 5];
int pg[305][1 << 17 | 5];
int pc[305][1 << 17 | 5];
int g[1 << 17 | 5][2];
int ans[305][305];
int main(){
    freopen("disanti.in", "r", stdin);
    freopen("disanti.out", "w", stdout);
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n >> m; int N = n * m;
    if(n < m){
	fl = 1;
    }
    for(int i = 1;i <= n;i++){
	cin >> (ss + 1);
	for(int j = 1;j <= m;j++){
	    if(fl) tt[j][i - 1] = ss[j] - '0';
	    else tt[i][j - 1] = ss[j] - '0';
	}
    }
    if(fl) swap(n, m);
    f[0][0] = 1; pf[0][0] = 1; pc[0][0] = 1;
    for(int i = 1;i <= N;i++){
	int x = (i - 1) / m + 1;
	int y = (i - 1) % m;
	for(int j = 0;j < (1 << m);j++){
	    if(y == 0){
		if(tt[x][y] != tt[x - 1][y] && ((j >> y) & 1)){
		    upd(pf[i][j], f[j][0]);
		}
		if(((j >> y) & 1) == 0){
		    upd(pf[i][j | (1 << y)], f[j][0]);
		    upd(pf[i][j], f[j][0]);
		}
		continue;
	    }
	    if(((j >> y) & 1) && x > 1 && tt[x][y] != tt[x - 1][y]){
		upd(pf[i][j], f[j][0]);
	    }
	    if(((j >> y) & 1) == 0){
		upd(pf[i][j ^ (1 << y)], f[j][0]);
		upd(pf[i][j], f[j][0]);
		if(y && tt[x][y] != tt[x][y - 1]) upd(pf[i][j], f[j][1]);
	    }
	}
	/*
	cerr << "? " << endl;
	for(int j = 0;j < (1 << m);j++){
	    cerr << pf[i][j] << " ";
	}
	cerr << endl;
	*/
	for(int j = 0;j < (1 << m);j++){
	    if(y == 0){
		if(tt[x][y] == tt[x - 1][y] && ((j >> y) & 1)){
		    upd(tmp[j][0], f[j][0]);
		    upd(tmp[j ^ (1 << y)][0], f[j][0]);
		}
		if(((j >> y) & 1) == 0){
		    upd(tmp[j | (1 << y)][0], f[j][0]);
		    upd(tmp[j][0], f[j][0]);
		    upd(tmp[j][1], f[j][0]);
		}
		continue;
	    }
	    if(((j >> y) & 1) && x > 1 && tt[x][y] == tt[x - 1][y]){
		upd(tmp[j][0], f[j][0]);
		upd(tmp[j ^ (1 << y)][0], f[j][0]);
	    }
	    if(((j >> y) & 1) == 0){
		if(y && tt[x][y] == tt[x][y - 1]){
		    upd(tmp[j][0], f[j][1]);
		    upd(tmp[j][1], f[j][1]);
		}
		upd(tmp[j ^ (1 << y)][0], f[j][0]);
		upd(tmp[j][0], f[j][0]);
		upd(tmp[j][1], f[j][0]);
	    }
	}
	for(int j = 0;j < (1 << m);j++){
	    pc[i][j] = tmp[j][0];
	    for(int k = 0;k < 2;k++){
		f[j][k] = tmp[j][k]; tmp[j][k] = 0;
	    }
	}
    }
    g[0][0] = 1; pg[N + 1][0] = 1;
    for(int i = N;i >= 1;i--){
	int x = (i - 1) / m + 1;
	int y = (i - 1) % m;
	for(int j = 0;j < (1 << m);j++){
	    if(y == m - 1){
		if(x + 1 <= n && tt[x][y] != tt[x + 1][y] && ((j >> y) & 1)){
		    upd(pg[i][j], g[j][0]);
		}
		if(((j >> y) & 1) == 0){
		    upd(pg[i][j | (1 << y)], g[j][0]);
		    upd(pg[i][j], g[j][0]);
		}
		continue;
	    }
	    if(((j >> y) & 1) && x + 1 <= n && tt[x][y] != tt[x + 1][y]){
		upd(pg[i][j], g[j][0]);
	    }
	    if(((j >> y) & 1) == 0){
		upd(pg[i][j ^ (1 << y)], g[j][0]);
		upd(pg[i][j], g[j][0]);
		if(y + 1 < m && tt[x][y] != tt[x][y + 1]) upd(pg[i][j], g[j][1]);
	    }
	}
	/*
	cerr << "? " << endl;
	for(int j = 0;j < (1 << m);j++){
	    cerr << g[j][1] << " ";
	}
	cerr << endl;
	*/
	for(int j = 0;j < (1 << m);j++) pf[i][j] = 1ll * pf[i][j] * pg[i][j] % mod;
	for(int j = 0;j < (1 << m);j++){
	    if(y == m - 1){
		if(x + 1 <= n && tt[x][y] == tt[x + 1][y] && ((j >> y) & 1)){
		    upd(tmp[j][0], g[j][0]);
		    upd(tmp[j ^ (1 << y)][0], g[j][0]);
		}
		if(((j >> y) & 1) == 0){
		    upd(tmp[j | (1 << y)][0], g[j][0]);
		    upd(tmp[j][0], g[j][0]);
		    upd(tmp[j][1], g[j][0]);
		}
		continue;
	    }
	    if(((j >> y) & 1) && x <= n && tt[x][y] == tt[x + 1][y]){
		upd(tmp[j][0], g[j][0]);
		upd(tmp[j ^ (1 << y)][0], g[j][0]);
	    }
	    if(((j >> y) & 1) == 0){
		if(y + 1 < m && tt[x][y] == tt[x][y + 1]){
		    upd(tmp[j][0], g[j][1]);
		    upd(tmp[j][1], g[j][1]);
		}
		upd(tmp[j ^ (1 << y)][0], g[j][0]);
		upd(tmp[j][0], g[j][0]);
		upd(tmp[j][1], g[j][0]);
	    }
	}
	for(int j = 0;j < (1 << m);j++){
	    pg[i][j] = tmp[j][0];
	    for(int k = 0;k < 2;k++){
		g[j][k] = tmp[j][k]; tmp[j][k] = 0;
	    }
	}
    }
    for(int i = 1;i <= N;i++){
	int y = (i - 1) % m + 1; int x = (i - 1) / m + 1;
	int S = 0;
	for(int j = 0;j < m;j++){
	    if(j == y - 1){
		S |= (1 << j); continue;
	    }
	    if(j < y - 1){
		S |= ((x + 1 <= n) && tt[x + 1][j] == tt[x][j] ? (1 << j) : 0);
	    }
	    if(j > y - 1){
		S |= ((x - 1 > 0) && tt[x - 1][j] == tt[x][j] ? (1 << j) : 0);
	    }
	}
	// cerr << "?? " << x << " " << y << " " << S << endl;
	for(int j = 0;j < (1 << m);j++){
	    if((S | j) != S) continue;
	    upd(ans[x][y], pf[i][j]);
	    if((j >> (y - 1)) & 1) continue;
	    upd(ans[x][y], mod - 1ll * pc[i - 1][j] * pg[i + 1][j] % mod);
	}
    }
    /*
    for(int i = 1;i <= N;i++){
	for(int j = 0;j < (1 << m);j++) cerr << pf[i][j] << " ";
	cerr << endl;
    }
    cerr << g[0][0] << endl;
    for(int i = 1;i <= N;i++){
	for(int j = 0;j < (1 << m);j++) cerr << pg[i][j] << " ";
	cerr << endl;
    }
    cerr << endl;
    for(int i = 1;i <= N;i++){
	for(int j = 0;j < (1 << m);j++) cerr << pc[i][j] << " ";
	cerr << endl;
    }
    */
    if(fl){
	for(int i = 1;i <= m;i++){
	    for(int j = 1;j <= n;j++) cout << ans[j][i] << " ";
	    cout << endl;
	}
    } else {
	for(int i = 1;i <= n;i++){
	    for(int j = 1;j <= m;j++) cout << ans[i][j] << " ";
	    cout << endl;
	}
    }
    return 0;
}
